#ifndef MB_TCP_H
#define MB_TCP_H

#include <stdint.h>
#include <string.h>
/* ----------------------- MBAP Header --------------------------------------*/
/*
 *
 * <------------------------ MODBUS TCP/IP ADU(1) ------------------------->
 *              <----------- MODBUS PDU (1') ---------------->
 *  +-----------+---------------+------------------------------------------+
 *  | TID | PID | Length | UID  |Code | Data                               |
 *  +-----------+---------------+------------------------------------------+
 *  |     |     |        |      |                                           
 * (2)   (3)   (4)      (5)    (6)                                          
 *
 * (2)  ... MB_TCP_TID          = 0 (Transaction Identifier - 2 Byte) 
 * (3)  ... MB_TCP_PID          = 2 (Protocol Identifier - 2 Byte)
 * (4)  ... MB_TCP_LEN          = 4 (Number of bytes - 2 Byte)
 * (5)  ... MB_TCP_UID          = 6 (Unit Identifier - 1 Byte)
 * (6)  ... MB_TCP_FUNC         = 7 (Modbus Function Code)
 *
 * (1)  ... Modbus TCP/IP Application Data Unit
 * (1') ... Modbus Protocol Data Unit
 */

#define MB_TCP_TID          0
#define MB_TCP_PID          2
#define MB_TCP_LEN          4
#define MB_TCP_UID          6
#define MB_TCP_FUNC         7

#define MB_TCP_PROTOCOL_ID  0   /* 0 = Modbus Protocol */

/**
  * @brief  上位机应答包信号量初始化
  * @param  None
  * @retval None.
  */
void tcp_master_ack_sem_init(void);
/**
 * @brief  01H读输出线圈
 * @param  slaveaddr:从机地址
 * @param  regaddr:寄存器的起始地址
 * @param  regcount:寄存器数量
 * @retval 无
 */
void MB_TCP_M_Read_Coil_Frame(uint8_t slaveaddr,uint16_t regaddr,uint16_t regcount);
/**
 * @brief  05H写单个线圈
 * @param  slaveaddr:从机地址
 * @param  regaddr:寄存器的起始地址
 * @param  regcount:寄存器值
 * @retval 无
 */
void MB_TCP_M_Write_Coil_Frame(uint8_t slaveaddr,uint16_t regaddr,uint16_t regvalue);
/**
 * @brief  03H读保持寄存器
 * @param  slaveaddr:从机地址
 * @param  regaddr:寄存器的起始地址
 * @param  regcount:寄存器数量
 * @retval 无
 */
void MB_TCP_M_Read_HoldingReg_Frame(uint8_t slaveaddr,uint16_t regaddr,uint16_t regcount);
/**
 * @brief  06H写单个保持寄存器
 * @param  slaveaddr:从机地址
 * @param  regaddr:寄存器的起始地址
 * @param  regcount:寄存器数量
 * @retval 无
 */
void MB_TCP_M_Write_OneHoldingReg_Frame(uint8_t slaveaddr,uint16_t regaddr,uint16_t regvalue);
/**
 * @brief  0FH写多个线圈
 * @param  slaveaddr:从机地址
 * @param  regaddr:寄存器的起始地址
 * @param  regcount:寄存器值
 * @retval 无
 */
void MB_TCP_M_Write_MultipleCoils_Frame(uint8_t slaveaddr,uint16_t regaddr,uint16_t regcount,uint8_t *valuebuf);
/**
 * @brief  10H写多个保持寄存器
 * @param  slaveaddr:从机地址
 * @param  regaddr:寄存器的起始地址
 * @param  regcount:寄存器数量
 * @retval 无
 */
void MB_TCP_M_Write_MultipleHoldingReg_Frame(uint8_t slaveaddr,uint16_t regaddr,uint16_t regcount,uint16_t *valuebuf);
/**
 * @brief  02H读离散输入
 * @param  slaveaddr:从机地址
 * @param  regaddr:寄存器的起始地址
 * @param  regcount:寄存器数量
 * @retval 无
 */
void MB_TCP_M_Read_DiscreteInput_Frame(uint8_t slaveaddr,uint16_t regaddr,uint16_t regcount);
/**
 * @brief  04H读输入寄存器
 * @param  slaveaddr:从机地址
 * @param  regaddr:寄存器的起始地址
 * @param  regcount:寄存器数量
 * @retval 无
 */
void MB_TCP_M_Read_InputReg_Frame(uint8_t slaveaddr,uint16_t regaddr,uint16_t regcount);
/**
 * @brief  modbus主机帧解析
 * @param  pbuf:数据帧
 * @param  len:数据长度
 * @retval 无
 */
void MB_TCP_Master_FrameAnalysis(uint8_t *pbuf,size_t len);
#endif

